msg_tool\scripts\yaneurao\itufuru/
crypto.rs

1use std::io::{Read, Seek, Write};
2
3pub struct Crypto<T> {
4    reader: T,
5    key: u8,
6}
7
8impl<T> Crypto<T> {
9    pub fn new(reader: T, key: u8) -> Self {
10        Crypto { reader, key }
11    }
12}
13
14impl<T: Read> Read for Crypto<T> {
15    fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
16        let read_bytes = self.reader.read(buf)?;
17        for byte in &mut buf[..read_bytes] {
18            *byte ^= self.key;
19        }
20        Ok(read_bytes)
21    }
22}
23
24impl<T: Seek> Seek for Crypto<T> {
25    fn seek(&mut self, pos: std::io::SeekFrom) -> std::io::Result<u64> {
26        self.reader.seek(pos)
27    }
28
29    fn rewind(&mut self) -> std::io::Result<()> {
30        self.reader.rewind()
31    }
32
33    fn stream_position(&mut self) -> std::io::Result<u64> {
34        self.reader.stream_position()
35    }
36}
37
38impl<T: Write> Write for Crypto<T> {
39    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
40        let mut encrypted_buf = buf.to_vec();
41        for byte in &mut encrypted_buf {
42            *byte ^= self.key;
43        }
44        self.reader.write(&encrypted_buf)
45    }
46
47    fn flush(&mut self) -> std::io::Result<()> {
48        self.reader.flush()
49    }
50}
51
52impl<T: std::fmt::Debug> std::fmt::Debug for Crypto<T> {
53    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
54        f.debug_struct("Crypto")
55            .field("reader", &self.reader)
56            .field("key", &self.key)
57            .finish()
58    }
59}